package com.twb.auth.controller;

import com.twb.auth.dataScope.enums.DataScopeType;
import com.twb.auth.entity.twbRole.TwbRole;
import com.twb.auth.entity.twbRole.dto.GetTwbRoleByIdDto;
import com.twb.auth.entity.twbRole.dto.SearchTwbRoleDto;
import com.twb.auth.entity.twbRole.vo.SaveTwbRoleDataScopeVo;
import com.twb.auth.entity.twbRole.vo.SaveTwbRoleVo;
import com.twb.auth.entity.twbRole.vo.SearchTwbRoleVo;
import com.twb.auth.entity.twbRole.vo.UpdateTwbRoleByIdVo;
import com.twb.auth.service.ITwbRoleService;
import com.twb.core.base.Result;
import com.twb.core.base.controller.BaseController;
import com.twb.core.security.annotation.Auth;
import com.twb.core.util.BeanUtils;
import com.twb.core.util.Results;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.UUID;

/**
 * @ClassName TwbRoleController
 * @Description 角色管理
 * @author DSY
 * @date 2018年11月15日 上午10:01:42
 */
@RestController
@RequestMapping("/sys/twbRole")
@Api(value = "TwbRoleController", tags = "角色管理接口")
public class TwbRoleController extends BaseController {

	@Autowired
	ITwbRoleService twbRoleService;

	/**
	 * @Title  searchTwbRole
	 * @Description 不分页查询角色
	 * @param vo
	 * @return
	 * @author DSY
	 * @date 2018年11月15日 上午10:09:33
	 */
	@GetMapping("/search")
	@ApiOperation(value = "不分页查询角色")
	public Result<List<SearchTwbRoleDto>> searchTwbRole(SearchTwbRoleVo vo) {
		List<SearchTwbRoleDto> result = twbRoleService.searchTwbRole(vo);
		return Results.successWithData(result);
	}

	/**
	 * @Title searchTwbRoleList
	 * @Description 查询角色列表
	 * @param vo
	 * @return com.twb.core.base.Result<java.util.List<com.twb.auth.entity.twbRole.dto.SearchTwbRoleDto>>
	 * @author DHL
	 * @date 13:35 2022/4/6
	 */
	@Auth(verifyURL = false)
	@GetMapping("/searchList")
	@ApiOperation(value = "查询角色列表")
	public Result<List<SearchTwbRoleDto>> searchTwbRoleList(SearchTwbRoleVo vo) {
		List<SearchTwbRoleDto> result = twbRoleService.searchTwbRole(vo);
		return Results.successWithData(result);
	}

	/**
	 * @Title  getTwbRoleById
	 * @Description 根据ID获取角色详情
	 * @param id
	 * @return
	 * @author DSY
	 * @date 2018年11月15日 上午10:48:30
	 */
	@GetMapping("/getById")
	@ApiOperation(value = "根据ID获取角色详情")
	public Result<GetTwbRoleByIdDto> getTwbRoleById(
			@NotBlank @RequestParam @ApiParam(value = "序号", name = "id", required = true) String id) {
		GetTwbRoleByIdDto dto = twbRoleService.getTwbRoleById(id);
		if(dto != null) {
			List<String> list = twbRoleService.listRoleDataScopes(id);
			dto.setDataScopeIds(list);
		}
		return Results.successWithData(dto);
	}

	/**
	 * @Title  saveTwbRole
	 * @Description 保存角色
	 * @param vo
	 * @return
	 * @author DSY
	 * @date 2018年11月15日 上午10:56:36
	 */
	@PostMapping("/save")
	@ApiOperation(value = "保存角色")
	public Result<String> saveTwbRole(@RequestBody @Valid SaveTwbRoleVo vo) {
		vo.setId(UUID.randomUUID().toString().replace("-", ""));

		boolean result = twbRoleService.saveTwbRole(vo);
		if (result) {
			return Results.successWithData(vo.getId(), "保存成功");
		} else {
			return Results.failure("保存失败");
		}
	}

	/**
	 * @Title  updateTwbRole
	 * @Description 
	 * @param vo
	 * @return
	 * @author DSY
	 * @date 2018年11月15日 上午11:19:27
	 */
	@PutMapping("/updateById")
	@ApiOperation(value = "更新角色")
	public Result<String> updateTwbRoleById(@RequestBody @Valid UpdateTwbRoleByIdVo vo) {
		TwbRole twbRole = twbRoleService.getById(vo.getId());
		if (null == twbRole) {
			return Results.failure("角色不存在");
		}

		BeanUtils.copyProperties(vo, twbRole);
		twbRoleService.setUpdateInfo(twbRole);

		boolean result = twbRoleService.updateById(twbRole);
		if (result) {
			return Results.success("更新成功");
		} else {
			return Results.failure("更新失败");
		}
	}


	/**
	 * @Title  deleteTwbRoleById
	 * @Description 删除角色信息
	 * @param id
	 * @return
	 * @author DSY
	 * @date 2018年11月9日 下午5:51:57
	 */
	@PostMapping("/deleteById")
	@ApiOperation(value = "删除角色信息")
	public Result<String> deleteTwbRoleById(@NotBlank @RequestParam String id) {
		boolean result = twbRoleService.deleteTwbRoleById(id);
		if (result) {
			return Results.success("删除成功");
		} else {
			return Results.failure("删除失败");
		}
	}

	/**
	 * @Title  updateOrgSeqById
	 * @Description 更新角色顺序号
	 * @param id
	 * @param roleSeq
	 * @return
	 * @author DSY
	 * @date 2018年11月13日 下午2:15:54
	 */
	@PostMapping("/updateSeq")
	@ApiOperation(value = "更新角色顺序号")
	public Result<String> updateOrgSeqById(@NotBlank @RequestParam String id, @NotNull @RequestParam Integer roleSeq) {
		TwbRole record = new TwbRole();
		record.setId(id);
		record.setRoleSeq(roleSeq);
		twbRoleService.setUpdateInfo(record);
		boolean result = twbRoleService.updateById(record);
		if (result) {
			return Results.success("更新成功");
		} else {
			return Results.failure("更新失败");
		}
	}

	/**
	 * @Title  saveRoleResource
	 * @Description 保存角色经办权限
	 * @param roleId
	 * @param resIds
	 * @return
	 * @author DSY
	 * @date 2018年11月22日 下午4:58:26
	 */
	@PostMapping("/saveRoleResource")
	@ApiOperation(value = "保存角色经办权限")
	public Result<String> saveRoleResource(
			@NotBlank @RequestParam String roleId,
			@RequestParam(required=false) String resIds,
			@NotBlank @RequestParam String projectId) {
		int result = twbRoleService.saveRoleResource(roleId, resIds, projectId);
		if (result > 0) {
			return Results.success("授权成功");
		} else {
			return Results.failure("授权失败");
		}
	}

	/**
	 * @Title  saveRoleAccreditResource
	 * @Description 保存角色授权权限
	 * @param roleId
	 * @param resIds
	 * @return
	 * @author DSY
	 * @date 2018年11月22日 下午5:27:18
	 */
	@PostMapping("/saveRoleAccreditResource")
	@ApiOperation(value = "保存角色授权权限")
	public Result<String> saveRoleAccreditResource(
			@NotBlank @RequestParam String roleId,
			@RequestParam(required=false) String resIds,
			@NotBlank @RequestParam String projectId) {
		int result = twbRoleService.saveRoleAccreditResource(roleId, resIds, projectId);
		if (result > 0) {
			return Results.success("授权成功");
		} else {
			return Results.failure("授权失败");
		}
	}

	/**
	 * @Title  listRoleIdsByUserId
	 * @Class: TwbRoleController.java
	 * @Description 获取用户角色ID
	 * @param userId
	 * @return
	 * @author DSY
	 * @date 2018年11月25日 下午9:19:47
	 */
	@Auth(verifyURL = false)
	@GetMapping("/listRoleIdsByUserId")
	@ApiOperation(value = "获取用户角色ID")
	public Result<List<String>> listRoleIdsByUserId(@NotBlank @RequestParam String userId) {
		List<String> roleIds = twbRoleService.listRoleIdsByUserId(userId);

		return Results.successWithData(roleIds);
	}

	/**
	 * @Title saveRoleUsers
	 * @Description 保存角色的用户
	 * @param roleId
	 * @param userIds
	 * @return
	 * @author DSY
	 * @date 2020年7月15日 下午3:16:17
	 */
	@PostMapping("/saveRoleUsers")
	@ApiOperation(value = "保存角色用户")
	public Result<String> saveRoleUsers(@NotBlank @RequestParam String roleId, @NotBlank @RequestParam String userIds) {
		int result = twbRoleService.saveRoleUsers(roleId, userIds);
		if (result > 0) {
			return Results.success("用户角色授权成功");
		} else {
			return Results.failure("用户角色授权失败");
		}
	}

	/**
	 * @Title deleteRoleUser
	 * @Description 删除角色配置的用户
	 * @param roleId
	 * @param userIds
	 * @return
	 * @author DSY
	 * @date 2020年7月15日 下午5:05:14
	 */
	@PostMapping("/deleteRoleUser")
	@ApiOperation(value = "删除角色配置的用户")
	public Result<String> deleteRoleUser(@NotBlank @RequestParam String roleId,
			@NotBlank @RequestParam String userIds) {
		int result = twbRoleService.deleteRoleUser(roleId, userIds);
		if (result > 0) {
			return Results.success("删除用户成功");
		} else {
			return Results.failure("删除用户失败");
		}
	}

	/**
	 * @Title saveRoleResource
	 * @Description 保存角色数据权限
	 * @param vo
	 * @return
	 * @AuthorOriginally DSY
	 * @date 2022年7月25日 下午8:33:15
	 */
	@PostMapping("/saveRoleDataScope")
	@ApiOperation(value = "保存角色数据权限")
	public Result<String> saveRoleDataScope(@RequestBody @Valid SaveTwbRoleDataScopeVo vo) {
		TwbRole twbRole = twbRoleService.getById(vo.getId());
		if (null == twbRole) {
			return Results.failure("角色不存在");
		}
		String dataScopeType = vo.getDataScopeType();
		twbRole.setDataScopeType(dataScopeType);
		twbRoleService.setUpdateInfo(twbRole);
		boolean result = twbRoleService.updateById(twbRole);
		//如果是自定义数据权限，则保存组织机构Id
		if(result && dataScopeType.equals(DataScopeType.DEFINE.getCode())) {
			twbRoleService.saveRoleDataScope(vo.getId(), vo.getDataScopeIds());
		}else {
			twbRoleService.deleteRoleDataScope(vo.getId());
		}
		if (result) {
			return Results.success("授权成功");
		} else {
			return Results.failure("授权失败");
		}
	}
	/**
	 * @Title listRoleDataScopes
	 * @Description 查询角色自定义数据权限
	 * @param roleId
	 * @return
	 * @AuthorOriginally DSY
	 * @date 2022年8月4日 下午6:21:51
	 */
	@GetMapping("/listRoleDataScopes")
	@ApiOperation(value = "查询角色自定义数据权限")
	public Result<List<String>> listRoleDataScopes(@NotBlank @RequestParam String roleId){
		List<String> list = twbRoleService.listRoleDataScopes(roleId);
		return Results.successWithData(list);
	}
}
